package com.atguigu.realtime.streaming.apps

import org.apache.spark.streaming.StreamingContext

/**
 * Created by Smexy on 2022/5/24
 *
 *    定义实时运算的一般逻辑
 *
 *        当前类必须是抽象类，才能声明抽象属性
 */
abstract class BaseApp {

  // 抽象属性:只声明，没赋值
  var appName:String

  var batchDuration:Int

  var groupId:String

  var topic:String

  //将StreamingContext交给子类实现，子类根据场景提供不同的appName,batchDuration
  var context:StreamingContext = null

  /**
   *  交给子类，调用此方法，运行sparkstreamingApp
   * @param code： 子类自己的业务实现代码
   */
  def runApp(code: => Unit) :Unit={
    try {

      //将②③④作为参数传入
      code

      context.start()

      context.awaitTermination()
    } catch {
      case ex: Exception =>
        ex.printStackTrace()
        throw new RuntimeException("运行出错!")
    }
  }


}
